/*
* Copyright (C) 2012 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package interactivespaces.service.script.internal.python;
import interactivespaces.InteractiveSpacesException;
import interactivespaces.activity.Activity;
import interactivespaces.activity.ActivityFilesystem;
import interactivespaces.activity.execution.ActivityExecutionContext;
import interactivespaces.configuration.Configuration;
import interactivespaces.service.script.ActivityScriptWrapper;
import interactivespaces.service.script.ScriptActivityExecutionContext;
import interactivespaces.service.script.ScriptSource;
import org.python.core.Py;
import org.python.core.PyException;
import org.python.core.PyObject;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;
import java.io.File;
/**
* An {@link ActivityScriptWrapper} for python scripts.
*
* @author Keith M. Hughes
*/
public class PythonActivityScriptWrapper implements ActivityScriptWrapper {
/**
* Name of the object being extracted.
*/
private String objectName;
/**
* The contents of the script.
*/
private ScriptSource scriptSource;
/**
* File system for the activity
*/
private ActivityFilesystem activityFilesystem;
/**
* Configuration for the activity script.
*/
private Configuration configuration;
public PythonActivityScriptWrapper(String objectName, ScriptSource scriptSource,
ActivityFilesystem activityFilesystem, Configuration configuration) {
this.objectName = objectName;
this.scriptSource = scriptSource;
this.activityFilesystem = activityFilesystem;
this.configuration = configuration;
}
@Override
public Activity newInstance() {
try {
PythonInterpreter interp = PythonInterpreter.threadLocalStateInterpreter(null);
// If script dir in the activity install, include at beginning of
// path.
File scriptDir = new File(activityFilesystem.getInstallDirectory(), "lib/python");
if (scriptDir.exists()) {
if (scriptDir.canRead()) {
PySystemState systemState = interp.getSystemState();
systemState.path.add(0, Py.newString(scriptDir.getAbsolutePath()));
}
}
String script = scriptSource.getScriptContents();
interp.exec(script);
PyObject cls = interp.get(objectName);
if (cls == null)
throw new InteractiveSpacesException(String.format("No callable class named %s in %s",
objectName, script));
PyObject processingUnit = cls.__call__();
Object o = processingUnit.__tojava__(Activity.class);
if (o == Py.NoConversion)
throw new InteractiveSpacesException(String.format(
"The value with name %s must implement %s", objectName, Activity.class.getName()));
return (Activity) o;
} catch (PyException e) {
e.printStackTrace();
throw new InteractiveSpacesException("Could not create Jython Interactive Spaces activity ",
e);
}
}
@Override
public ActivityExecutionContext newExecutionContext() {
return new ScriptActivityExecutionContext(PythonActivityScriptWrapper.class.getClassLoader());
}
}